package com.liusy.taskengine.jobmodel;

import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.apache.log4j.Logger;

import com.liusy.jdbc.JdbcHelp;
import com.liusy.taskengine.JobTask;
import com.liusy.taskengine.TaskEngineConstant;


/**
 * 数据库 任务池接口（任务源）
 * 
 * @author liusy 2012-12-13
 */
public class DBJobModel extends AbstractJobModel{

	private static Logger log = Logger.getLogger(JobTask.class);
	
	private String sql = "";

	private Connection cn = null;
	
	//数据库查sql处理询类
	protected Statement s = null;
	
	private List<Map<String,Object>> listMp=null;
	private List<Object> listObj =null;
	private String sqlStr = null;
	
	private String pagingSql = "SELECT * FROM ( SELECT SHOWDATA.*, ROWNUM RN FROM ( #jobsql ) SHOWDATA ) WHERE RN <= #rownum_to AND RN > #rownum_from";
	
	/**
	 * 配置任务模型,默认每次从任务池中取出1000个任务。
	 * 
	 * @param sql      数据来源
	 * @param sqlExecuteModelClassStr   执行者模型
	 * @param sqlTaskModelClassStr  任务模型
	 */
	public DBJobModel(String sql,String sqlTaskModelClassStr){
		super(sqlTaskModelClassStr);
		this.sql = sql;
	}
	
	
	/**
	 * 配置任务模型
	 * 
	 * @param sql 数据来源
	 * @param pageSize    每次从任务池中取出任务数。
	 * @param sqlExecuteModelClassStr  执行者模型
	 * @param sqlTaskModelClassStr 任务模型
	 */
	public DBJobModel(String sql,int pageSize,String sqlTaskModelClassStr){
		super(sqlTaskModelClassStr);
		this.sql = sql;
		this.pageSize= pageSize;
	}
	
	
	/**
	 * 配置任务模型
	 * 
	 * @param sql 数据来源
	 * @param pageSize 每次从任务池中取出任务数。
	 * @param pagingSql 分页sql{SELECT * FROM ( SELECT SHOWDATA.*, ROWNUM RN FROM ( #jobsql ) SHOWDATA ) WHERE RN <= #rownum_to AND RN > #rownum_from}
	 * @param sqlExecuteModelClassStr 执行者模型
	 * @param sqlTaskModelClassStr 任务模型
	 */
	public DBJobModel(String sql,int pageSize,String pagingSql,String sqlTaskModelClassStr){
		super(sqlTaskModelClassStr);
		this.sql = sql;
		this.pageSize= pageSize;
		this.pagingSql = pagingSql;
	}
	
	/*
	 * 进行分页sql组合
	 * 
	 * @return
	 */
	public String ReplaceSqlPage(){
		
		int rownfrom = (pageIndex-1)*pageSize;
		int rownumto = pageIndex*pageSize;
		return pagingSql.replace("#jobsql", sql).replace("#rownum_from", ""+rownfrom).replace("#rownum_to", ""+rownumto);
	}
	
	
	
	/*
	 * 从任务池中取任务
	 * 
	 * (non-Javadoc)
	 * @see com.liusy.taskengine.IJobModel#getTaskPoolData()
	 */
	@Override
	public List<Object> getTaskPoolData() {
		listObj = new ArrayList<Object>();
		if(null == cn || null == s)
		{
			cn = JdbcHelp.getJdbcHelp().getConnection(TaskEngineConstant.QUERY_TASK_CONNECTION);
			try {
				if(null ==cn)
				{
					log.info("数据库链接：["+TaskEngineConstant.QUERY_TASK_CONNECTION+"],不能得到。请检查.....");
					System.exit(0);
				}
				if( null == s)
				s = cn.createStatement();
			} catch (SQLException e) {
				log.error(e.getMessage());
				e.printStackTrace();
			}
		}

		sqlStr  = ReplaceSqlPage();
		log.debug(sqlStr);
		listMp = JdbcHelp.getDataObject(sqlStr, this.s);
		listObj.addAll(listMp);
		return listObj;
	}
	
	
}
